package com.shp.service.serviceImpl;

import com.shp.dao.CollectionDao;
import com.shp.dao.PurseDao;
import com.shp.dao.ShopCartDao;
import com.shp.dao.UserDao;
import com.shp.pojo.*;
import com.shp.service.UserService;
import com.shp.utils.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.util.List;

/**
 * @author ZWL
 * @version 1.0
 * @date 2020/2/23 13:14
 */
@Service(value = "userService")
public class UserServiceImpl implements UserService {

    @Autowired
    private UserDao userDao;

    @Autowired
    private ShopCartDao shopCartDao;

    @Autowired
    private CollectionDao collectionDao;

    @Autowired
    private PurseDao purseDao;

    /**
     * 根据用户的id，查询用户信息
     *
     * @param userId 用户id
     * @return User
     */
    @Override
    public User getUserById(Integer userId) {
        return userDao.getUserById(userId);
    }

    /**
     * 获取所有用户
     */
    @Override
    public List<User> getAll() {
        return userDao.getAllUsers();
    }

    /**
     * 注册用户
     *
     * @param user    用户信息
     * @param session 此次会话session
     * @param info    响应的信息
     * @return true正常成功;否则注册失败
     */
    @Override
    public ResultInfo register(User user, HttpSession session, ResultInfo info) {
        //获取session中的验证码
        String code = session.getAttribute("checkCode").toString();
        //移除session中的验证码,保证一次性
        session.removeAttribute("checkCode");
        //校验验证码
        if (code != null && code.equalsIgnoreCase(user.getCheckCode())) {
            //判断用户是否已经注册
            if (userDao.isExist(user.getEmail()) == null) {
                //随机生成激活码
                String activateId = UuidUtil.getUuid();
                //激活邮件发送
                String content = "<a href='" + session.getServletContext().getAttribute("basePath") + "/active/" + activateId + "'>点击激活[二手交易平台]</a>";
                if (MailUtils.sendMail(user.getEmail(), content, "激活邮件")) {
                    String nowTime = DateUtil.getNowTime();
                    //初始化注册时间
                    user.setCreate_at(nowTime);
                    //初始化最近登陆的时间
                    user.setLast_login(nowTime);
                    //初始未激活状态
                    user.setStatus((byte) 0);
                    //初始化信誉分
                    user.setPower("100");

                    //初始化激活码
                    user.setCode(activateId);
                    //保存用户
                    userDao.insert(user);

                    // 初始化钱包信息
                    Purse purse = new Purse();
                    purse.setUser_id(user.getId());
                    purse.setBalance((float)0);
                    purseDao.insert(purse);

                    info.setFlag(true);
                } else {
                    info.setErrorMsg("不存在的邮箱");
                }
                return info;
            }
            info.setErrorMsg("此用户已经注册");
            return info;
        }
        info.setErrorMsg("验证码错误");
        return info;
    }

    /**
     * 登录验证
     *
     * @param user    用户信息
     * @param session 会话session
     * @return ResultInfo对象
     */
    @Override
    public ResultInfo loginCheck(User user, HttpSession session) {
        //定义响应对象
        ResultInfo info = new ResultInfo();
        if (user != null) {
            //获取验证码
            String checkCode = user.getCheckCode();
            Object checkCode1 = session.getAttribute("checkCode");
            //移除验证码，保证唯一性
            session.removeAttribute("checkCode");
            //判断验证码
            if (checkCode != null && checkCode1 != null && checkCode.equalsIgnoreCase(checkCode1.toString())) {
                User user1 = userDao.findUserByEmailAndPassword(user.getEmail(), user.getPassword());
                //判断用户的email和密码
                if (user1 != null) {
                    //判断是否激活
                    if (user1.getStatus() == 1) {
                        //设置登陆成功标识
                        info.setFlag(true);
                        //将用户的信息保存到session中
                        session.setAttribute("activeUser", user1);
                    } else {
                        info.setErrorMsg("账号尚未激活");
                    }
                } else {
                    info.setErrorMsg("邮箱或密码错误");
                }
            } else {
                info.setErrorMsg("验证码错误");
            }
        }
        return info;
    }

    /**
     * 添加商品到购物车
     *
     * @param id      商品id
     * @param request HttpServletRequest
     * @return ResultInfo
     */
    @Override
    public ResultInfo addNotice(Integer id, HttpServletRequest request, ResultInfo info) {
        // 获取在线用户
        User activeUser = (User) request.getSession().getAttribute("activeUser");

        // 检查添加到购物车的商品是否，已经存在
        if (shopCartDao.isExistShopCart(id,activeUser.getId()) > 0) {
            info.setErrorMsg("该商品已经添加");
            return info;
        }

        // 设置shopcart
        ShopCartItem item = new ShopCartItem();
        item.setUser_id(activeUser.getId());
        item.setGoods_id(id);
        item.setStart_at(DateUtil.getNowTime());


        // 保存到购物车
        int row = shopCartDao.insert(item);
        if (row > 0) {
            int userId = shopCartDao.getShopCartItemSize(activeUser.getId());
            info.setDatas(userId);
            // 添加成功
            info.setFlag(true);
        } else {
            info.setErrorMsg("服务器错误，加入购物车失败");
        }
        return info;
    }

    /**
     * 忘记密码，产生随机密码，邮件发送新密码
     *
     * @param email 用户邮箱
     * @param info  响应信息ResultInfo
     * @return 响应信息ResultInfo
     */
    @Override
    public ResultInfo forgetPassword(String email, ResultInfo info) {
        // 如果前台传递的数据是邮箱
        if (email != null && ValidateUtils.checkEmail(email)) {
            User user = userDao.isExist(email);
            // 验证此邮箱用户，是否已经注册
            if (user != null) {
                // 产生随机密码
                String newPassword = PasswordUtil.createPassword(8);
                String text = "<h1>您好，" + user.getUserName() + ":</h1>" + "<p>您的随机密码为" + newPassword +",请妥善保管，建议修改为自己的密码！</p>此致<br/>唐僧肉";
                boolean flag = MailUtils.sendMail(email, text, "二手交易平台用户找回密码");
                // 密码邮件发送成功
                if (flag) {
                    // 修改用户密码
                    userDao.updatePasswordByEmail(email, newPassword);
                    info.setFlag(true);
                } else {
                    info.setErrorMsg("网络繁忙，请稍后重试");
                }
            } else {
                info.setErrorMsg("此邮箱未注册");
            }
        } else {
            info.setErrorMsg("请输入正确的邮箱");
        }
        return info;
    }

    /**
     * 将商品添加到收藏夹
     *
     * @param id      商品id
     * @param session 会话session
     * @return ResultInfo
     */
    @Override
    public ResultInfo collectionGoods(Integer id, HttpSession session,ResultInfo info) {
        // 检查添加到收藏夹的商品是否，已经存在
        if (collectionDao.isExistCollection(id) > 0) {
            info.setErrorMsg("该商品已经添加");
            return info;
        }
        // 获取在线用户
        User activeUser = (User) session.getAttribute("activeUser");

        // 设置CollectionItem
        CollectionItem item = new CollectionItem();
        item.setUser_id(activeUser.getId());
        item.setGoods_id(id);
        item.setStart_at(DateUtil.getNowTime());


        // 保存到收藏夹
        int row = collectionDao.insertCollection(item);
        if (row > 0) {
            // 添加成功
            info.setFlag(true);
        } else {
            info.setErrorMsg("服务器错误，加入购物车失败");
        }
        return info;
    }

    /**
     * 修改个人信息
     *
     * @param user User
     * @return true代表修改成功，否则失败
     */
    @Override
    public boolean updateUser(User user) {
        return userDao.update(user) == 1;
    }

    /**
     * 获取系统信息
     *
     * @return List<SystemMsg>
     */
    @Override
    public List<SystemMsg> getSystemMsgList() {
        return userDao.getSystemMsgByDate();
    }

    /**
     * 根据条件，查询所有符合的User
     *
     * @param user 条件如下：<br/>
     *             user.phone - 手机 <br/>
     *             user.userName - 昵称 <br/>
     *             user.email - 邮箱 <br/>
     *             user.status - 状态 <br/>
     *             user.registerFlag - 注册期限 <br/>
     * @return 查询成功返回List<User>集合；否则返回null
     */
    @Override
    public List<User> getUserBySelect(User user) {
        if(user != null){
            return userDao.getUserBySelect(user);
        }
        return null;
    }

    /**
     * 批量删除用户
     *
     * @param userIds 用户id
     * @return true代表删除成功；否则删除失败
     */
    @Override
    public boolean deleteUser(Integer[] userIds) {
        return userDao.deleteUser(userIds) >= 1;
    }
}
